package mtt.model.calendar;

import java.util.Date;
import java.util.Hashtable;


public class Week {

	/**
	 * Definiert die Woche als gerade Woche
	 */
	public static final int geradeWoche = 0;

	/**
	 * Definiert die Woche als ungerade Woche
	 */
	public static final int ungeradeWoche = 1;
	
	/**
	 * enthält das Date des ersten Tags der Woche
	 */
	private Date dateFirstDayOfWeek;
	
	/**
	 * enthält das Date des letzten Tags der Woche
	 */
	private Date dateLastDayOfWeek;
	
	/**
	 * enthält Day-Objekte für jeden Tag <Day.index_*>,<Day>
	 */
	private Hashtable hashtableDays = new Hashtable(7);
	
	/**
	 * enthält die Wochen-Nummer (1-52)
	 */
	private int intWeekNumber;

	/**
	 * enthält den Typ der Woche (gerade/ungerade) bzw (Week.geradeWoche/Week.ungeradeWoche)
	 */
	private int weekType;

	/**
	 * Fügt den Tag zur Hashtable hinzu, indexOfDay muss gesetzt sein
	 * 
	 * @param day
	 * @param indexDay
	 * @throws NullPointerException
	 *             wenn der indexOfDay nicht gesetzt ist
	 */
	public void addDay(Day day) {
		this.hashtableDays.put(new Integer(day.getIndexOfDay()), day);
	}
	
	public Date getDateFirstDayOfWeek() {
		return dateFirstDayOfWeek;
	}
	
	public Date getDateLastDayOfWeek() {
		return dateLastDayOfWeek;
	}

	/**
	 * liefert das ein Day-Objekt zum gegebenen Index
	 * @param int Index des Tages der zurückgegebem werden soll, muss zwischen Day.index_Monday und Day.index_Sunnday liegen
	 * @return Day
	 * @throws IndexOutOfBoundsException
	 */
	public Day getDay(int indexOfDay) throws IndexOutOfBoundsException {
		
		if ((indexOfDay < Day.index_MONDAY) || (indexOfDay > Day.index_SUNDAY)) {
			throw new IndexOutOfBoundsException("Der Index muss zwischen Day.index_MONDAY und indexOfDay > Day.index_SUNDAY liegen");
		}
		
		/*
		 * exsistiert das Day-Objekt schon 
		 */
		if (this.hashtableDays.contains(new Integer(indexOfDay))) {
			/*
			 * Day-Objekt zurück geben
			 */
			return (Day) this.hashtableDays.get(new Integer(indexOfDay));
		} else {
			
			/*
			 * neues Day-Objekt für den Index anlegen und in der Hashtable speichern
			 */
			Day day = new Day();
			day.setIndexOfDay(indexOfDay);
			addDay(day);
			return day;
		}
		
		
	}

	public Hashtable getHashtableDays() {
		return hashtableDays;
	}

	public int getIntWeekNumber() {
		return intWeekNumber;
	}

	/**
	 * liefert den Typ der Wochen (gerade/ungerade)
	 * @return Week.geradeWoche bzw Week.ungeradeWoche
	 */
	public int getWeekType() {
		return this.weekType;
	}

	public void setDateFirstDayOfWeek(Date dateFirstDayOfWeek) {
		this.dateFirstDayOfWeek = dateFirstDayOfWeek;
	}
	
	public void setDateLastDayOfWeek(Date dateLastDayOfWeek) {
		this.dateLastDayOfWeek = dateLastDayOfWeek;
	}
	
	public void setHashtableDays(Hashtable hashtableDays) {
		this.hashtableDays = hashtableDays;
	}

	/**
	 * setzt die intWeekNumber und den weekType
	 * @param intWeekNumber
	 */
	public void setIntWeekNumber(int intWeekNumber) {
		this.intWeekNumber = intWeekNumber;
		
		if (intWeekNumber % 2 == 0) {
			setWeekType(geradeWoche);
		} else {
			setWeekType(ungeradeWoche);
		}
	}

	/**
	 * setzt den Typ der Woche (Week.geradeWoche bzw Week.ungeradeWoche)
	 * @param Week.geradeWoche bzw Week.ungeradeWoche
	 */
	private void setWeekType(int intWeekType) {
		//TODO: intWeekType prüfen
		this.weekType = intWeekType;
	}
}
